/**
 * 740. 删除并获取点数
 */
public class Exerciser3 {
    public int deleteAndEarn(int[] nums) {
        int n = 10001;
        // 给的数组的下标 和对应的值不是我们想要的，我们需要把nums中相同的值计算总和当入到新的数组中对应数据的下标
        int[] arr = new int[n];
        for(int num : nums) {
            arr[num] += num;
        }

        // 利用这个 arr数组进行 "打家劫舍" 问题的解决一遍
        // 这样就可以根据下标的值映射出对应的总和
        int[] f = new int[n];//到达i位置后，选择arr[i]，之后最大的点数
        int[] g = new int[n];//到达i位置后，不选择arr[i]，之后最大的点数
        // 初始化
        f[0] = arr[0];
        g[0] = 0;
        for(int i = 1;i < n;i++) {
            f[i] = g[i - 1] + arr[i];
            g[i] = Math.max(f[i - 1],g[i - 1]);
        }
        return Math.max(f[n - 1],g[n - 1]);
    }
}
